#ifndef FFMPEG_H
#define FFMPEG_H

#include <QObject>
#include <QDebug>
#include <QDateTime>
#include <QMutex>
#include <QImage>

extern "C"
{
#include <libavcodec/avcodec.h>
#include <libavdevice/avdevice.h>
#include <libavformat/avformat.h>
#include <libavutil/avutil.h>
#include <libavutil/mem.h>
#include <libavutil/fifo.h>
#include <libavutil/frame.h>
#include <libswscale/swscale.h>
}

class FFmpeg : public QObject
{
    Q_OBJECT
public:
    explicit FFmpeg(QObject *parent = nullptr);
    ~FFmpeg();

    void setUrl(QString url);
    bool init();
    void play();

    void stopReadFrame();

signals:
    void drawImage(const QImage &image);    /* 发送图像信号 */

private:
    AVFrame* alloc_picture(enum AVPixelFormat pix_fmt, qint32 width, qint32 height);

private:
    QString url_;
    qint32 video_stream_index_; // 视频流索引
    qint32 video_width_;
    qint32 video_height_;
    bool is_stop_;

    QMutex mutex_;

    AVFormatContext *avformat_context_; // 解封装上下文空间
    AVCodecContext *avcodec_context_;   // 解码器上下文
    AVFrame *av_frame_;     // 存储解码后的原始音频或视频数据的单帧控件
    AVFrame *av_frame_rgb_; // 目的buffer，存储rgb单帧控件
    SwsContext *sws_context_;   // 图像转换上下文
    AVPacket *av_packet_;    // 数据包空间
};

#endif // FFMPEG_H
